package com.zenithmind.coding.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.coding.pojo.dto.ContestCreateDTO;
import com.zenithmind.coding.pojo.entity.Contest;
import com.zenithmind.coding.pojo.vo.ContestVO;

import java.util.List;

/**
 * 编程竞赛服务接口 - 遵循接口隔离原则，专门处理竞赛相关功能
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ContestService extends IService<Contest> {

    /**
     * 创建竞赛
     * 
     * @param createDTO 创建DTO
     * @return 竞赛VO
     */
    ContestVO createContest(ContestCreateDTO createDTO);

    /**
     * 分页查询竞赛列表
     * 
     * @param current 当前页
     * @param size 页大小
     * @param status 竞赛状态
     * @param type 竞赛类型
     * @param keyword 关键词
     * @return 分页结果
     */
    PageResult<ContestVO> getContestPage(Long current, Long size, Integer status, Integer type, String keyword);

    /**
     * 根据ID查询竞赛详情
     * 
     * @param id 竞赛ID
     * @return 竞赛VO
     */
    ContestVO getContestById(String id);

    /**
     * 更新竞赛
     * 
     * @param id 竞赛ID
     * @param updateDTO 更新DTO
     * @return 竞赛VO
     */
    ContestVO updateContest(String id, ContestCreateDTO updateDTO);

    /**
     * 删除竞赛
     * 
     * @param id 竞赛ID
     * @return 是否成功
     */
    Boolean deleteContest(String id);

    /**
     * 参加竞赛
     * 
     * @param contestId 竞赛ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean joinContest(String contestId, String userId);

    /**
     * 退出竞赛
     * 
     * @param contestId 竞赛ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean leaveContest(String contestId, String userId);

    /**
     * 获取竞赛参与者
     * 
     * @param contestId 竞赛ID
     * @param limit 限制数量
     * @return 参与者列表
     */
    List<Object> getContestParticipants(String contestId, Integer limit);

    /**
     * 获取竞赛排行榜
     * 
     * @param contestId 竞赛ID
     * @param limit 限制数量
     * @return 排行榜
     */
    List<Object> getContestLeaderboard(String contestId, Integer limit);

    /**
     * 开始竞赛
     * 
     * @param contestId 竞赛ID
     * @return 是否成功
     */
    Boolean startContest(String contestId);

    /**
     * 结束竞赛
     * 
     * @param contestId 竞赛ID
     * @return 是否成功
     */
    Boolean endContest(String contestId);

    /**
     * 获取用户参与的竞赛
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 竞赛列表
     */
    List<ContestVO> getUserContests(String userId, Integer limit);

    /**
     * 检查用户是否可以参加竞赛
     * 
     * @param contestId 竞赛ID
     * @param userId 用户ID
     * @return 是否可以参加
     */
    Boolean canUserJoinContest(String contestId, String userId);

    /**
     * 获取竞赛统计信息
     * 
     * @param contestId 竞赛ID
     * @return 统计信息
     */
    Object getContestStatistics(String contestId);

    /**
     * 批量导入竞赛
     * 
     * @param contests 竞赛列表
     * @return 导入成功数量
     */
    Integer batchImportContests(List<ContestCreateDTO> contests);

    /**
     * 导出竞赛
     * 
     * @param contestIds 竞赛ID列表
     * @return 导出数据
     */
    List<ContestVO> exportContests(List<String> contestIds);
}
